;****************************************************************************** ; The IL interpreter commented ;****************************************************************************** start_of_il: fcb $24,':',$11+$80 ; PL : print literal ":",XON fcb $27 ; GL : get input line fcb $10 ; SB : save BASIC pointer fcb $E1 ; BE 01: if not eoln, branch to il_test_insert fcb $59 ; BR 19: branch to start_of_il il_test_insert: fcb $C5 ; BN 05: if not number, branch to il_test_let fcb $2A ; IL : insert BASIC line fcb $56 ; BR 16: branch to start_of_il il_run: fcb $10 ; SB : save BASIC pointer fcb $11 ; RB : restore BASIC pointer fcb $2C ; XC : execute il_test_let: fcb $8B,'L','E',$D4 ; BC 0B: if not "LET", branch to il_test_go fcb $A0 ; BV 00: if not variable, error fcb $80,'='+$80 ; BC 00: if not "=", error il_let: fcb $30,$BC ; JS 0BC: call il_expr fcb $E0 ; BE 00: if not eoln, error fcb $13 ; SV : store variable fcb $1D ; NX : next BASIC statement il_test_go: fcb $94,'G','O'+$80 ; BC 14: if not "GO", branch to il_test_10 fcb $88,'T','O'+$80 ; BC 08: if not "TO", branch to il_test_sub fcb $30,$BC ; JS 0BC: call il_expr fcb $E0 ; BE 00: if not eoln, error fcb $10 ; SB : save BASIC pointer fcb $11 ; RB : restore BASIC pointer fcb $16 ; GO : GOTO il_test_sub: fcb $80,'S','U','B'+$80 ; BC 00: if not "SUB", error fcb $30,$BC ; JS 0BC: call il_expr fcb $E0 ; BE 00: if not eoln, error fcb $14 ; GS : GOSUB save fcb $16 ; GO : GOTO il_test_pr: fcb $90,'P','R'+$80 ; BC 10: if not "PR", branch to il_jump1 fcb $83,'I','N','T'+$80 ; BC 03: if not "INT", branch to il_print il_print: fcb $E5 ; BE 05: if not eoln, branch to il_pr_test_dq fcb $71 ; BR 31: branch to il_pr_must_eoln il_pr_test_semi: fcb $88,';'+$80 ; BC 08: if not ";", branch to il_pr_test_com il_pr_eoln: fcb $E1 ; BE 01: if not eoln, branch to il_pr_test_dq fcb $1D ; NX : next BASIC statement il_pr_test_dq: fcb $8F,'"'+$80 ; BC 0F: if not dblquote, branch to il_pr_expr fcb $21 ; PQ : print BASIC string fcb $58 ; BR 18: branch to il_test_semi il_jump1: fcb $6F ; BR 2F: branch to il_test_if il_pr_test_com: fcb $83,','+$80 ; BC 03: if not ",", branch to il_test_colon fcb $22 ; PT : print TAB fcb $55 ; BR 15: branch to il_pr_eoln il_test_colon: fcb $83,':'+$80 ; BC 03: if not ":", branch to il_pr_must_eoln fcb $24,$13+$80 ; PR : print literal XOFF il_pr_must_eoln: fcb $E0 ; BE 00: if not eoln, error fcb $23 ; NL : new line fcb $1D ; NX : next statement il_pr_expr: fcb $30,$BC ; JS 0BC: call il_expr fcb $20 ; PN : print number fcb $48 ; BR 08: branch to il_pr_test_semi fcb $91,'I','F'+$80 ; BC 11: if not "IF", branch to il_test_input il_test_if: fcb $30,$BC ; JS 0BC: call il_expr fcb $31,$34 ; JS 134: call il_cmpop fcb $30,$BC ; JS 0BC: call il_expr fcb $84,'T','H','E','N'+$80 ; BC 04: if not "THEN", branch to il_test_input fcb $1C ; CP : compare fcb $1D ; NX : next BASIC statement fcb $38,$D ; J 00D: jump il_test_let il_test_input: fcb $9A,'I','N','P','U','T'+$80 ; BC 1A: if not "INPUT", branch to il_test_return il_in_more: fcb $A0 ; BV 00: if not variable, error fcb $10 ; SB : save BASIC pointer fcb $E7 ; BE 07: if not eoln, branch to il_in_test_com il_in_query: fcb $24,'?',' ',$11+$80 ; PR : print literal "? ",XON fcb $27 ; GL : get input line fcb $E1 ; BE 01: if not eoln, branch to il_in_test_com fcb $59 ; BR 19: branch to il_in_query il_in_test_com: fcb $81,','+$80 ; BC 01: if not ",", branch to il_in_get fcb $30,$BC ; JS 0BC: call il_expr fcb $13 ; SV : store variable fcb $11 ; RB : restore BASIC pointer fcb $82,','+$80 ; BC 02: if not ",", branch il_in_done fcb $4D ; BR 0D: branch to il_in_more fcb $E0 ; BE 00: if not eoln, error fcb $1D ; NX : next BASIC statement il_test_return: fcb $89,'R','E','T','U','R','N'+$80 ; BC 09: if not "RETURN", branch to il_test_end fcb $E0 ; BE 00: if not eoln, error fcb $15 ; RS : restore saved line fcb $1D ; NX : next BASIC statement il_test_end: fcb $85,'E',N','D'+$80 ; BC 05: if not "END", branch to il_test_list fcb $E0 ; BE 00: if not eoln, error fcb $2D ; WS : stop il_test_list: fcb $98,'L','I','S','T'+$80 ; BC 18: if not "LIST", branch to il_test_run fcb $EC ; BE 0C: if not eoln, branch to il_li_line il_li_newline: fcb $24,0,0,0,0,$0A,0+$80 ; PR : print literal NUL,NUL,NUL,NUL,LF,NUL fcb $1F ; LS : list the program fcb $24,$13+$80 ; PR : print literal XOFF fcb $23 ; NL : newline fcb $1D ; NX : next BASIC statement il_li_line: fcb $30,$BC ; JS 0BC: call il_expr fcb $E1 ; if not eoln, branch to il_li2 fcb $50 ; BR 10: branch to il_li_newline fcb $80,','+$80 ; BC 00: if not ",", error fcb $59 ; BR 19: branch to il_li_line il_test_run: fcb $85,'R','U','N'+$80 ; BC 05: if not "RUN", branch to il_test_clear fcb $38,$0A ; J 00A: branch to il_run il_test_clear: fcb $86,'C','L','E','A','R'+$80 ; BC 06: if not "CLEAR", branch to il_test_rem fcb $2B ; MT : mark basic program space empty il_test_rem: fcb $84,'R','E','M'+$80 ; BC 04: if not "REM, branch to il_assign fcb $1D ; NX : next BASIC statement fcb $A0 ; BV 00: if not variable, error il_assign: fcb $80,'='+$80 ; BC 00: if not "=", error fcb $38,$14 ; J 014: branch to il_let il_expr: fcb $85,'-'+$80 ; if not "-", branch to il_expr_plus fcb $30,$D3 ; JS 0D3: call il_term fcb $17 ; NE : negate fcb $64 ; BR 24: branch to il_expr1 il_expr_plus: fcb $81,'+'+$80 ; BC 01: if not "+", branch to il_expr0 il_expr0: fcb $30,$D3 ; JS 0D3: call il_term il_expr1: fcb $85,'+'+$80 ; BC 05: if not "+", branch to il_expr2 fcb $30,$D3 ; JS 0D3: call il_term fcb $18 ; AD : add fcb $5A ; BR 1A: branch to il_expr1 il_expr2: fcb $85,'-'+$80 ; BC 05: if not "-", branch to il_term fcb $30,$D3 ; JS 0D3: call il_term fcb $19 ; SU : subtract fcb $54 ; BR 14: branch to il_expr1 il_expr3: fcb $2F ; RT : return il_term: fcb $30,$E2 ; JS 0E2: call il_fact il_term0: fcb $85,'*'+$80 ; BC 05: if not "*", branch to il_term1 fcb $30,$E2 ; JS 0E2: call il_factor fcb $1A ; MP : multiply fcb $5A ; BR 1A: branch to il_term0 il_term1: fcb $85,'/'+$80 ; if not "/", branch to il_term2 fcb $30,$E2 ; JS 0E2: call il_factor fcb $1B ; DV : divide fcb $54 ; BR 14: branch to il_term0 il_term2: fcb $2F ; RT : return il_factor: fcb $98,'R','N','D'+$80 ; BC 18: if not RND, branch to il_factor1 fcb $A,$80,$80 ; LN : push literal 0x8080 fcb $12 ; FV : fetch variable rnd_seed fcb $A,$09,$29 ; LN : push literal 0x0929 fcb $1A ; MP : multiply fcb $A,$1A,$85 ; LN : push literal 0x1A85 fcb $18 ; AD : add fcb $13 ; SV : store variable rnd_seed fcb 9,$80 ; LB : push literal byte 0x80 fcb $12 ; FV : fetch variable rnd_seed fcb 1 ; SX 01: stack exchange fcb $B ; DS : duplicate stack top fcb $31,$30 ; JS 130: call il_rn_paren fcb $61 ; BR 21: branch to il_factor2 il_factor1: fcb $72 ; BR 32: branch to il_usr il_factor2: fcb $B ; DS : duplicate stack top fcb 4 ; SX 04: stack exchange fcb 2 ; SX 02: stack exchange fcb 3 ; SX 03: stack exchange fcb 5 ; SX 05: stack exchange fcb 3 ; SX 03: stack exchange fcb $1B ; DV : divide fcb $1A ; MP : multiply fcb $19 ; SU : subtract fcb $B ; DS : duplicate stack top fcb 9,$06 ; LB : push literal byte 0x06 fcb $A,$00,$00 ; LN : push literal number 0x0000 fcb $1C ; CP : compare fcb $17 ; NE : negate fcb $2F ; RT : return il_usr: fcb $8F,'U','S','R'+$80 ; BC 0F: if not "USR", branch to il_factor3 fcb $80 ; BC 00: if not "(", error fcb $A8 ; if not variable, branch to il_usr1 fcb $30,$BC ; JS 0BC: call il_expr fcb $31,$2A ; JS 12A: call il_us_test_com fcb $31,$2A ; JS 12A: call il_us_test_com fcb $80,')'+$80 ; BC 00: if not ")", error il_usr1: fcb $2E ; US : machine language call fcb $2F ; RT : return il_factor3: fcb $A2 ; BV 02: if not variable, branch to il_factor4 fcb $12 ; FV : fetch variable fcb $2F ; RT : return il_factor4: fcb $C1 ; BN 01: if not number, branch to il_lparen fcb $2F ; RT : return fcb $80,'('+$80 ; BC 00: if not "(", error il_factor5: fcb $30,$BC ; JS 0BC: call il_expr fcb $80,')'+$80 ; BC 00: if not ")", error fcb $2F ; RT : return il_us_test_com: fcb $83,','+$80 ; BC 03: if not ",", branch to il_us_dup fcb $38,$BC ; J 0BC: branch to il_expr il_us_dup: fcb $B ; DS : duplicate stack top fcb $2F ; RT : return il_rn_paren: fcb $80,'('+$80 ; BC 00: if not "(", error fcb $52 ; BR 12: branch to il_factor5 fcb $2F ; RT : return il_cmpop: fcb $84,'='+$80 ; if not "=", branch to il_cmpop1 fcb 9,$02 ; LB : push literal byte 0x02 fcb $2F ; RT ; return il_cmpop1: fcb $8E,'<'+$80 ; BR 0E: if not "<", branch to il_cmpop4 fcb $84,'='+$80 ; BR 04: if not "=", branch to il_cmpop2 fcb 9,$93 ; LB : push literal byte 0x93 fcb $2F ; RT : return il_cmpop2: fcb $84,'>'+$80 ; BR 04: if not ">", branch to il_cmpop3 fcb 9,$05 ; LB : push literal byte 0x05 fcb $2F ; RT : return il_cmpop3: fcb 9,$91 ; LB : push literal byte 0x91 fcb $2F ; RT : return il_cmpop4: fcb $80,'>'+$80 ; BR 00: if not ">", error fcb $84,'='+$80 ; BR 04: if not "=", branch to il_cmpop5 fcb 9,$06 ; LB : push literal byte 0x06 fcb $2F ; RT : return il_cmpop5: fcb $84,'<'+$80 ; BR 04: if not "<", branch to il_cmpop6 fcb 9,$95 ; LB : push literal byte 0x95 fcb $2F ; RT : return il_cmpop6: fcb 9,$04 ; LB : push literal byte 0x04 fcb $2F ; RT :return fcb 0 fcb 0